//Copyright (c) 2009, Sandeep Datta
//All rights reserved.
//
//Redistribution and use in source and binary forms, with or without modification, are permitted provided 
//that the following conditions are met:
//
//* Redistributions of source code must retain the above copyright notice, this list of conditions and 
//the following disclaimer.
//
//* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and 
//the following disclaimer in the documentation and/or other materials provided with the distribution.
//
//* Neither the name of Sandeep Datta nor the names of its contributors may be used to endorse or 
//promote products derived from this software without specific prior written permission.
//
//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR 
//IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
//FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 
//CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
//CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
//WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
//OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace SharpInstall
{
    [Serializable]
    public struct TableInfo
    {
        public string Name;
        public ColumnInfo[] Column;

        public TableInfo(string name, ColumnInfo[] columnInfo)
        {
            this.Name = name;
            this.Column = columnInfo;
        }

        private static Dictionary<string, TableInfo> _tableInfo = new Dictionary<string, TableInfo>();

        static TableInfo()
        {
            populateTableInfo();
        }

        private static void populateTableInfo()
        {
            //TODO: populate _tableInfo with table information from schema.msi IDT files.

            List<TableInfo> tables;

            using (Stream s = new MemoryStream(SharpInstall.Schema, false))
            {
                BinaryFormatter deserializer = new BinaryFormatter();
                tables = (List<TableInfo>)deserializer.Deserialize(s);
            }

            for (int i = 0; i < tables.Count; i++)
            {
                _tableInfo.Add(tables[i].Name, tables[i]);
            }
        }

        public static TableInfo GetTableInfo(TableType tableName)
        {
            return _tableInfo[tableName.ToString()];
        }

        public static TableInfo GetTableInfo(string tableName)
        {
            return _tableInfo[tableName];
        }
    }
}
